/**
 * 对象操作工具类
 */
export default class ObjectUtil {

    /**
     * 比较两个对象是否相等, 比较的属性以target对象为基准
     * @param target 需要比较的目标对象, 一般为新对象
     * @param source 源对象, 一般为原始的旧对象
     * @returns {T | null} 如果对象完全相等则返回null, 否则返回两个对象的差异部分
     */
    public static compareObject<T extends object>(target: T, source: T): Partial<T> | null {
        const result: Partial<T> = {};
        Object.keys(target).forEach(k => {
           if (target[k as keyof T] !== source[k as keyof T]){
               result[k as keyof T] = target[k as keyof T];
           }
        });
        return Object.keys(result).length > 0 ? result : null;
    }

    /**
     * 更新对象, 将target中的属性值更新到source对象中
     * @param target 目标对象, 此对象的属性会全部设置到source对象中
     * @param source 源对象, 等待属性更新的对象
     */
    public static updateObject<T extends object>(target: T, source: T):void {
        Object.keys(target).forEach(k => source[k as keyof T] = target[k as keyof T]);
    }

}